﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;

namespace ShiQuan.Security
{
    /// <summary>
    /// MD5主要是用来做数据校验的，用于确保信息传输完整一致。
    /// </summary>
    public static class MD5Security
    {
        /// <summary>
        /// MD5 加密
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public static string EncryptMD5(this string input)
        {
            // 加密后是一个字节类型的数组，这里要注意编码UTF8/Unicode等的选择　
            byte[] bytes = MD5Security.Encrypt(System.Text.Encoding.UTF8.GetBytes(input));
            return System.Text.Encoding.UTF8.GetString(bytes);
        }

        /// <summary>
        /// MD5 加密
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public static string Encrypt(string input)
        {
            // 加密后是一个字节类型的数组，这里要注意编码UTF8/Unicode等的选择　
            byte[] bytes = MD5Security.Encrypt(System.Text.Encoding.UTF8.GetBytes(input));
            return System.Text.Encoding.UTF8.GetString(bytes);
        }
        /// <summary>
        /// MD5 加密
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public static byte[] Encrypt(byte[] input)
        {　
            MD5 md5 = MD5.Create();
            return md5.ComputeHash(input);
        }
        
        /// <summary>
        /// 32位MD5加密
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public static string EncryptMD532(this string input)
        {
            // 加密后是一个字节类型的数组，这里要注意编码UTF8/Unicode等的选择　
            return MD5Security.Encrypt32(System.Text.Encoding.UTF8.GetBytes(input));
        }
        /// <summary>
        /// 32位MD5加密
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public static string Encrypt32(string input)
        {
            // 加密后是一个字节类型的数组，这里要注意编码UTF8/Unicode等的选择　
            return MD5Security.Encrypt32(System.Text.Encoding.UTF8.GetBytes(input));
        }
        /// <summary>
        /// 32位MD5加密
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public static string Encrypt32(byte[] input)
        {
            string result = "";
            // 加密后是一个字节类型的数组，这里要注意编码UTF8/Unicode等的选择　
            byte[] s = MD5Security.Encrypt(input);
            // 通过使用循环，将字节类型的数组转换为字符串，此字符串是常规字符格式化所得
            for (int i = 0; i < s.Length; i++)
            {
                // 将得到的字符串使用十六进制类型格式。格式后的字符是小写的字母，如果使用大写（X）则格式后的字符是大写字符 
                result = result + s[i].ToString("X");
            }
            return result;
        }
        /// <summary>
        /// 64位MD5加密
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public static string EncryptMD564(this string input)
        {
            // 加密后是一个字节类型的数组，这里要注意编码UTF8/Unicode等的选择　
            return MD5Security.Encrypt64(System.Text.Encoding.UTF8.GetBytes(input));
        }
        /// <summary>
        /// 64位MD5加密
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public static string Encrypt64(string input)
        {
            // 加密后是一个字节类型的数组，这里要注意编码UTF8/Unicode等的选择　
            return MD5Security.Encrypt64(System.Text.Encoding.UTF8.GetBytes(input));
        }
        /// <summary>
        /// 64位MD5加密
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public static string Encrypt64(byte[] input)
        {
            //实例化一个md5对像
            MD5 md5 = MD5.Create();
            // 加密后是一个字节类型的数组，这里要注意编码UTF8/Unicode等的选择　
            byte[] result = md5.ComputeHash(input);
            return Convert.ToBase64String(result);
        }
        /// <summary>
        /// 验证Md5 hash
        /// </summary>
        /// <param name="input">原字符串</param>
        /// <param name="encrypt32Str">原字符串的md5码</param>
        /// <returns></returns>
        public static bool VerifyMd5Hash(this string input, string encrypt32Str)
        {
            return input.VerifyMd532Hash(encrypt32Str);
        }
        /// <summary>
        /// 验证Md5 hash
        /// </summary>
        /// <param name="input">原字符串</param>
        /// <param name="encrypt32Str">原字符串的md5码</param>
        /// <returns></returns>
        public static bool VerifyMd532Hash(this string input, string encrypt32Str)
        {
            string hashOfInput = input.EncryptMD532();
            StringComparer comparer = StringComparer.OrdinalIgnoreCase;
            if (0 == comparer.Compare(hashOfInput, encrypt32Str))
                return true;
            else
                return false;
        }
        /// <summary>
        /// 验证Md5 hash
        /// </summary>
        /// <param name="input">原字符串</param>
        /// <param name="encrypt64Str">原字符串的md5码</param>
        /// <returns></returns>
        public static bool VerifyMd564Hash(this string input, string encrypt64Str)
        {
            string hashOfInput = input.EncryptMD564();
            StringComparer comparer = StringComparer.OrdinalIgnoreCase;
            if (0 == comparer.Compare(hashOfInput, encrypt64Str))
                return true;
            else
                return false;
        }
    }
}
